package sy6_Behavioral_Pattern.strategy;
/*
 * 策略模式示例
 * 角色1：抽象策略接口Strategy
 * 角色2：具体策略类StrategyA、StrategyB，...
 * 角色3：上下文环境类Context，聚合了策略接口类型的对象，定义了使用具体策略的方法contextInterface()
 * 功能：上下文对象的行为随着策略对象的改变而改变
 */

interface Strategy { //抽象策略接口
    public void algorithmInterface();  //定义算法接口
}

class ConcreteStrategyA implements Strategy {  //具体策略类
    @Override
    public void algorithmInterface() {
        System.out.println("Speak English.");
    }
}

class ConcreteStrategyB implements Strategy {   //具体策略类
    @Override
    public void algorithmInterface() {
        System.out.println("Speak Chinese.");
    }
}

class Context {  //上下文环境类
    Strategy strategy;  //Context聚合Strategy对象

    public void setStrategy(Strategy strategy) {  //setter
        this.strategy = strategy;
    }

    public void contextInterface() {  //定义上下文接口方法
        strategy.algorithmInterface();  //调用策略算法接口
    }
}

public class Clinet {  //客户端
    public static void main(String[] args) {
        //创建一个具体策略，也可以通过.xml文件里
        //Strategy strategy=new ConcreteStrategyA();
        Strategy strategy = new ConcreteStrategyB();
        //创建上下文对象并选用（执行）对应的策略
        Context context = new Context();  //Clinet关联Context，只与上下文对象打交道

        context.setStrategy(strategy);  //Setter注入
        context.contextInterface();  //方法调用，本质上是对调用策略接口方法
    }
}
